package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanMensagem;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class AMensagem extends DialogBox
{
	private BeanMensagem mensagem = new BeanMensagem();

	private VerticalPanel vPanel;

	private Button fecharBtn;
	private Button responderBtn;

	public AMensagem(Integer idMensagem)
	{
		this.setText("Visualização de mensagem");

		vPanel = new VerticalPanel();
		vPanel.setSpacing(10);

		fecharBtn = new Button("Fechar");
		responderBtn = new Button("Responder");

		AsyncCallback<BeanMensagem> cbMensagem = new AsyncCallback<BeanMensagem>()
		{
			public void onSuccess(BeanMensagem result)
			{
				mensagem.setId(result.getId());
				mensagem.setAssunto(result.getAssunto());
				mensagem.setMensagem(result.getMensagem());
				mensagem.setDataEnvio(result.getDataEnvio());
				mensagem.setDestinatario(result.getDestinatario());
				mensagem.setRemetente(result.getRemetente());

				// adiciona o remetente
				if (mensagem.getRemetente() instanceof BeanProfissionalAssinante)
				{
					vPanel.add(new HTML("<b>De:</b> " + ((BeanProfissionalAssinante) mensagem.getRemetente()).getNome()));
				}
				else if (mensagem.getRemetente() instanceof BeanEmpresaAssinante)
				{
					vPanel.add(new HTML("<b>De:</b> " + ((BeanEmpresaAssinante) mensagem.getRemetente()).getRazaoSocial()));
				}

				// adiciona o destinatario
				if (mensagem.getDestinatario() instanceof BeanProfissionalAssinante)
				{
					vPanel.add(new HTML("<b>Para:</b> " + ((BeanProfissionalAssinante) mensagem.getDestinatario()).getNome()));
				}
				else if (mensagem.getDestinatario() instanceof BeanEmpresaAssinante)
				{
					vPanel.add(new HTML("<b>Para:</b> " + ((BeanEmpresaAssinante) mensagem.getDestinatario()).getRazaoSocial()));
				}

				vPanel.add(new HTML("Data de envio: " + mensagem.getDataEnvio()));
				vPanel.add(new HTML("<b>Assunto: " + mensagem.getAssunto() + "</b>"));

				TextArea area = new TextArea();
				area.setSize("500px", "200px");
				area.setReadOnly(true);

				area.setText(mensagem.getMensagem());

				vPanel.add(area);

				HorizontalPanel rodape = new HorizontalPanel();
				rodape.setSpacing(3);
				rodape.add(responderBtn);
				rodape.add(fecharBtn);

				vPanel.add(rodape);

				// sub callback: apenas para setar a mensagem como lida no banco
				AsyncCallback cbMensagemLida = new AsyncCallback()
				{
					public void onSuccess(Object result) { };
					public void onFailure(Throwable caught) { };
				};

				Util.getService().setMensagemLida(mensagem, cbMensagemLida);
			}

			public void onFailure(Throwable caught)
			{
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao visualizar mensagem: " + caught.getMessage());

				errorDialogBox.center();
				errorDialogBox.show();
			}
		};

		Util.getService().getMensagemById(idMensagem, cbMensagem);

		// FECHAR
		fecharBtn.addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						AMensagem.this.hide();
					}
				}
		);
		
		// RESPONDER
		responderBtn.addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						AMensagem.this.hide();

						ARespondeMensagem viewRespondeMensagem = new ARespondeMensagem( AMensagem.this.mensagem );
						viewRespondeMensagem.show();
					}
				}
		);

		AMensagem.this.add(vPanel);
	}

	public void setRespondivel(boolean respondivel)
	{
		responderBtn.setVisible(respondivel);
	}
}